package com.example.gbb;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
import android.widget.Toast;

import com.example.gbb.adapters.GridViewAdapter;
import com.example.gbb.adapters.ListViewAdapter;
import com.example.gbb.adapters.RecyclerViewBaseAdapter;
import com.example.gbb.adapters.StaggerViewAdapter;
import com.example.gbb.bean.Datas;
import com.example.gbb.bean.ItemBean;

import java.util.ArrayList;
import java.util.List;

/**
 * 总结
 * 1.首先我们要添加androidx包下的RecyclerView依赖
 * 2.通过findViewById找到控件
 * 3.准备好数据
 * 4.设置布局管理器
 * 5.创建适配器
 * 6设置适配器
 * 7.RecyclerView绑定适配器，显示数据
 */

public class MainActivity extends AppCompatActivity {
    private LinearLayoutManager linearLayoutManager;    //布局管理器用来设置RecyclerView控件是显示ListView样式还是GradView样式
    private StaggeredGridLayoutManager staggeredGridLayoutManager;          //布局管理器用来设置RecyclerView控件是显示瀑布流样式
    private RecyclerViewBaseAdapter mAdapter;
    private RecyclerView recyclerView;           //RecyclerView控件
    private SwipeRefreshLayout refreshLayout;   //下拉刷新控件
    private List<ItemBean> list;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化控件
        initView();

        //初始化数据
        initData();


        //----------------------------------------刷新数据------------------------------------------>
        //设置加载圈的颜色变化
        refreshLayout.setColorSchemeResources(R.color.colorPrimary,R.color.colorPrimaryDark,R.color.colorAccent);
        refreshLayout.setEnabled(true);
        refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                //一般来说，我们在请求一个数据是在开启一个子线程来获取服务器上的数据
                //这里是直接添加四条数据
                for(int i=0;i < 4;i++){
                    ItemBean itemBean = new ItemBean();
                    itemBean.title = "我是新添加的数据"+i+"...";
                    itemBean.icon = Datas.icons[i];
                    list.add(i,itemBean);
                }

                //更新UI
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //这里要做两件事，一件是让刷新停止，另一件则是要更新列表
                        mAdapter.notifyDataSetChanged();
                        refreshLayout.setRefreshing(false);
                    }
                },3000);
            }
        });
        //<-----------------------------------------结束-------------------------------------------->


    }



    private void initListener() {
        mAdapter.setOnItemClickListener(new RecyclerViewBaseAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                //这里处理点击事件
                Toast.makeText(MainActivity.this,list.get(position).title, Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void initData() {
        //创建数据集合
        list = new ArrayList<>();

        //创建模拟数据
         for(int i = 0;i < Datas.icons.length;i++){
             //创建数据对象
             ItemBean itemBean = new ItemBean();
             itemBean.icon = Datas.icons[i];
             itemBean.title = "我是第 " + i + " 个条目";
             //对象添加到数据集合中
             list.add(itemBean);
         }
         //第一次进入调用垂直标准
         //调用方法绑定数据
        showList(true,false);

    }

    /**
     * 绑定控件
     */
    private void initView() {
        recyclerView = this.findViewById(R.id.recycler_view);
        refreshLayout = this.findViewById(R.id.refresh_layout);
    }

    //设置标题栏的菜单
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu,menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
       int itemId = item.getItemId();
       switch (itemId){


           /**
            * ListView部分
            */
           //垂直标准
           case R.id.list_view_vertical_stander:
               Toast.makeText(MainActivity.this,item.getTitle(),Toast.LENGTH_SHORT).show();
               showList(true,false);
               break;
           //垂直反向
           case R.id.list_view_vertical_reverse:
               Toast.makeText(MainActivity.this,item.getTitle(),Toast.LENGTH_SHORT).show();
               showList(true,true);
               break;
           //水平标准
           case R.id.list_view_horizontal_stander:
               Toast.makeText(MainActivity.this,item.getTitle(),Toast.LENGTH_SHORT).show();
               showList(false,false);
               break;
           //水平反向
           case R.id.list_view_horizontal_reverse:
               Toast.makeText(MainActivity.this,item.getTitle(),Toast.LENGTH_SHORT).show();
               showList(false,true);
               break;


           /**
            * GridView部分
            */

           //垂直标准
           case R.id.grid_view_vertical_stander:
               Toast.makeText(MainActivity.this,item.getTitle(),Toast.LENGTH_SHORT).show();
               showGrid(true,false);
               break;
           //垂直反向
           case R.id.grid_view_vertical_reverse:
               Toast.makeText(MainActivity.this,item.getTitle(),Toast.LENGTH_SHORT).show();
               showGrid(true,true);
               break;
           //水平标准
           case R.id.grid_view_horizontal_stander:
               Toast.makeText(MainActivity.this,item.getTitle(),Toast.LENGTH_SHORT).show();
               showGrid(false,false);
               break;
           //水平反向
           case R.id.grid_view_horizontal_reverse:
               Toast.makeText(MainActivity.this,item.getTitle(),Toast.LENGTH_SHORT).show();
               showGrid(false,true);
               break;


           /**
            * 瀑布流部分
            */
           //垂直标准
           case R.id.stagger_view_vertical_stander:
               Toast.makeText(MainActivity.this,item.getTitle(),Toast.LENGTH_SHORT).show();
               showStagger(true,false);
               break;
           //垂直反向
           case R.id.stagger_view_vertical_reverse:
               Toast.makeText(MainActivity.this,item.getTitle(),Toast.LENGTH_SHORT).show();
               showStagger(true,true);
               break;
           //水平标准
           case R.id.stagger_view_horizontal_stander:
               Toast.makeText(MainActivity.this,item.getTitle(),Toast.LENGTH_SHORT).show();
               showStagger(false,false);
               break;
           //水平反向
           case R.id.stagger_view_horizontal_reverse:
               Toast.makeText(MainActivity.this,item.getTitle(),Toast.LENGTH_SHORT).show();
               showStagger(false,true);
               break;


           /**
            * 混合使用
            */

           case R.id.mor_type:
               Toast.makeText(MainActivity.this,item.getTitle(),Toast.LENGTH_SHORT).show();

               //跳转到新的Actiyity中实现这个功能
               Intent intent = new Intent(MainActivity.this,Main2Activity.class);
               startActivity(intent);
               break;
       }

        return super.onOptionsItemSelected(item);
    }



    //《-----------------------------------自定义方法----------------------------------------------》

    /**
     * 设置为ListView样式
     * 第一个参数是判断条目显示是水平(true)还是垂直(false)
     * 第二个参数说判断条目是正向(从上到下)(false)显示 还是反向(从下到上)(true)显示
     * @param isVertical
     * @param isReverse
     */
    private void showList(boolean isVertical,boolean isReverse){
        //RecyclerView需要设置样式，其实就是设置布局管理器
        linearLayoutManager = new LinearLayoutManager(this);

        //调用show方法,设置管理器调用信息
        show(isVertical, isReverse);

        //创建适配器
        mAdapter = new ListViewAdapter(list);
        //添加适配器
        recyclerView.setAdapter(mAdapter);

        //创建监听事件
        initListener();
    }

    /**
     * 设置为GridView样式
     * @param isVertical
     * @param isReverse
     */
    private void showGrid(boolean isVertical,boolean isReverse){
        //获取布局管理器并且设置管理器样式是GridView样式
        linearLayoutManager =new GridLayoutManager(MainActivity.this,2);

        //调用show方法，设置调用信息
        show(isVertical, isReverse);

        //获取适配器
        mAdapter = new GridViewAdapter(list);
        //绑定适配器
        recyclerView.setAdapter(mAdapter);

        //创建监听事件
        initListener();
    }

    /**
     * 设置为瀑布流样式，参数一是显示列数 这里是只显示2列    参数二是条目是水平(true)显示还是垂直(false)显示
     * @param isVertical
     * @param isReverse
     */
    private void showStagger(boolean isVertical, boolean isReverse){
        //管理器设置为2列并且设置条目是水平还是垂直显示
        staggeredGridLayoutManager = new StaggeredGridLayoutManager(2,isVertical?StaggeredGridLayoutManager.VERTICAL:StaggeredGridLayoutManager.HORIZONTAL);

        //设置布局管理器的显示方向是正向(从上到下显示)还是反向(从下到上开始)显示
        staggeredGridLayoutManager.setReverseLayout(isReverse);
        //添加布局管理器
        recyclerView.setLayoutManager(staggeredGridLayoutManager);

        //获取适配器，传入数据
        mAdapter = new StaggerViewAdapter(list);
        //添加适配器
        recyclerView.setAdapter(mAdapter);

        //创建监听事件
        initListener();
    }

    /**
     * 设置LinearLayoutManager布局管理器一些通用信息
     * @param isVertical
     * @param isReverse
     */
    private void show(boolean isVertical, boolean isReverse) {

        //通过布局管理器来控制条目显示是水平还是垂直
        //如果isVertical为true说明布局是水平的，false为垂直
        linearLayoutManager.setOrientation(isVertical ? LinearLayoutManager.VERTICAL : LinearLayoutManager.HORIZONTAL);
        //设置条目是(标准)正向还是反向
        linearLayoutManager.setReverseLayout(isReverse);

        //向控件添加布局管理器
        recyclerView.setLayoutManager(linearLayoutManager);
    }
//《-----------------------------------------------结束--------------------------------------------》
}
